package com.coolt.server.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.coolt.domain.Mensagens;

public class MensagemDAO {

	public static List<Mensagens> listar(Mensagens msg, int tipo) {
		return listar(msg, tipo, 0, 0);
	}

	public static List<Mensagens> listar(Mensagens msg, int tipo,
			int tamPagina, int pageNow) {

		List<Mensagens> lista = null;

		DetachedCriteria criterialista = DetachedCriteria
				.forClass(Mensagens.class);

		criterialista.add(Example.create(msg).ignoreCase().enableLike(
				MatchMode.ANYWHERE));

		if (msg.getItem() != null) {
			criterialista.createAlias("item", "item").add(
					Restrictions.eq("item.cditem", msg.getItem().getCditem()));
		}

		if (msg.getUsuariodestino() != null) {
			if (msg.getUsuariodestino().getCdusuario() != null) {

				if (tipo == Mensagens.TIPO_TODAS
						&& msg.getUsuariosender() != null) {

					if (msg.getUsuariodestino().getCdusuario() != msg
							.getUsuariosender().getCdusuario()) {

						criterialista
								.createAlias("usuariodestino", "usudestino")
								.createAlias("usuariosender", "ususender")
								.add(
										Restrictions
												.or(

														Restrictions
																.and(
																		Restrictions
																				.eq(
																						"usudestino.cdusuario",
																						msg
																								.getUsuariodestino()
																								.getCdusuario()),
																		Restrictions
																				.eq(
																						"ususender.cdusuario",
																						msg
																								.getUsuariosender()
																								.getCdusuario())),
														Restrictions
																.and(
																		Restrictions
																				.eq(
																						"usudestino.cdusuario",
																						msg
																								.getUsuariosender()
																								.getCdusuario()),
																		Restrictions
																				.eq(
																						"ususender.cdusuario",
																						msg
																								.getUsuariodestino()
																								.getCdusuario()))));
					} else {
						criterialista.createAlias("usuariodestino",
								"usudestino").createAlias("usuariosender",
								"ususender").add(
								Restrictions.or(Restrictions.eq(
										"usudestino.cdusuario", msg
												.getUsuariodestino()
												.getCdusuario()), Restrictions
										.eq("ususender.cdusuario", msg
												.getUsuariosender()
												.getCdusuario())));
					}
				} else {
					criterialista.createAlias("usuariodestino", "usudestino")
							.add(
									Restrictions
											.eq("usudestino.cdusuario", msg
													.getUsuariodestino()
													.getCdusuario()));
				}
			} else {
				criterialista.add(Restrictions.isNull("usuariodestino"));
			}
		}

		if (msg.getUsuariosender() != null) {
			if (msg.getUsuariosender().getCdusuario() != null) {
				if (tipo != Mensagens.TIPO_TODAS) {
					criterialista
							.createAlias("usuariosender", "ususender")
							.add(
									Restrictions.eq("ususender.cdusuario", msg
											.getUsuariosender().getCdusuario()));
				}
			} else {
				criterialista.add(Restrictions.isNull("usuariosender"));
			}
		}

		criterialista.addOrder(Order.desc("cdmensagem"));

		Session session = HibernateUtil.getSession();
		session.beginTransaction();

		Criteria criteria = criterialista.getExecutableCriteria(session);
		if (tamPagina > 0) {
			criteria.setMaxResults(tamPagina);
			if (pageNow > 1) {
				criteria.setFirstResult((pageNow - 1) * tamPagina);
			}
		}
		lista = criteria.list();

		session.getTransaction().commit();

		return lista;

	}
}